import org.apache.spark.{SparkConf, SparkContext}
import org.junit.Test

class Spark原理案例 {
  @Test
  def WordCount(): Unit = {
    val conf = new SparkConf().setMaster("local[6]").setAppName("WordCount")
    val sc = new SparkContext(conf)
    val dataRDD = sc.parallelize(Seq(("hello world"), ("spark world"), ("world hello")))
    val tupleRDD = dataRDD.flatMap(item => item.split(" "))
      .map(item => (item, 1))
      //_表示第一个数据，当有俩个时，第二个表示，第二个数据的第一个
      //下面表示第一个元素的第一个数据，和第二个元素的第一个相加
      .reduceByKey(_ + _)
      .map(item => s"${item._1},${item._2}")
      .collect()
      .foreach(println)
    sc.stop()
  }

  /**
    * 窄依赖
    * 求俩个RDD的笛卡尔积
    */
  @Test
  def narrowDependency(): Unit = {
    val conf = new SparkConf().setMaster("local[6]").setAppName("narrow")
    val sc = new SparkContext(conf)
    val rdd1 = sc.parallelize(Seq(1, 2, 3, 4, 5, 6))
    val rdd2 = sc.parallelize(Seq("a", "b", "c"))
    rdd1.cartesian(rdd2)
      .collect().foreach(println(_))
    sc.stop()
  }
}
